package com.Calculator.controller.DisplayText;

import com.Calculator.view.Panel.impl.TextPanel;
import com.Calculator.view.TextField.impl.DisplayText;
import com.Calculator.view.TextField.impl.ProcessText;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class KeyListener extends KeyAdapter {
    //计算结果数字
    private final StringNumber display;
    //预操作数字
    private final StringNumber temp;
    //运算数字
    private final StringNumber preDisplay;
    //运算符号
    private String sign;
    //判断是否是“借数情况”：如键盘连续按下“ 7 ” “ + ” “ Enter ”
    private boolean borrow;
    //运算过程显示文本框
    private final ProcessText processText;
    //运算结果显示文本框
    private final DisplayText displayText;


    public KeyListener(TextPanel textPanel) {
        display = new StringNumber();
        temp = new StringNumber();
        preDisplay = new StringNumber();
        sign = "null";
        borrow = false;
        processText = textPanel.getProcessText();
        displayText = textPanel.getDispalyText();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        super.keyPressed(e);
        //键盘数据
        /* keyCode对应参数：
                   0-9：96-105
                   .：110
                   +：107
                   -：109
                   *：106
                   /：111
                   b：66
                   c：67
                   r：82
                   Enter：10
                   BackSpace：8
                   Shift：16

         */
        int keyCode = e.getKeyCode();

        //退位功能：键盘“b”键(英文不区分大小写)
        if (keyCode == 66) {
            //清空运算文本框
            if (display.isEnterLock() && !sign.equals("null")) processText.getJTextField().setText("");
            //退位
            else {
                if (display.isBackLock()) display.backNumber();
                else if (temp.isBackLock()) temp.backNumber();
            }
        }

        //录入函数：小键盘数字
        if (keyCode == 96 || keyCode == 97 || keyCode == 98 || keyCode == 99 || keyCode == 100 || keyCode == 101 || keyCode == 102 || keyCode == 103 || keyCode == 104 || keyCode == 105) {
            //如果刚点完确认，更新“借数情况”
            if (display.isEnterLock()) borrow = false;
            //判断输入哪个数据
            if (sign.equals("null")) display.inputNumber(keyCode);
            else temp.inputNumber(keyCode);
            //预先存储计算中数据，及时更新
            preDisplay.setStringNumber(display.getStringNumber());

        }

        //切换小数模式：小键盘“.”键
        if (keyCode == 110) {
            //判断输入的是否为操作数
            if (sign.equals("null")) display.switchNumber();
            else temp.switchNumber();
        }

        //复位功能：键盘“r”键(英文不区分大小写)
        if (keyCode == 82) {
            display.reSetNumber();
            temp.reSetNumber();
            preDisplay.reSetNumber();
            sign = "null";
            borrow = false;
        }

        //Enter功能：键盘“Enter”键
        if (keyCode == 10) {
            //“借数情况”：
            if (!sign.equals("null") && !borrow && temp.getStringNumber().isEmpty()) {
                temp.setStringNumber(display.getStringNumber());
                borrow = true;
            }
            //正常点击：包含加减乘除功能
            display.enterNumber(temp, sign);
        }

        //正负切换: 键盘“c”键
        System.out.println(keyCode);
        if (keyCode == 67) {
            //判断输入的是否为操作数
            if (sign.equals("null")) display.changeNumber();
            else temp.changeNumber();

            preDisplay.setStringNumber(display.getStringNumber());
        }

        /*运算交给Enter执行，四种方法中的addNumber()等操作用于连加情况
         *四种方法使用的是小键盘的加减乘除
         */
        //加法功能
        if (keyCode == 107) {
            if (sign.equals("+")) {
                display.addNumber(temp);
            }
            sign = "+";
            temp.reSetNumber();
        }
        //减法功能
        if (keyCode == 109) {
            if (sign.equals("-")) {
                display.addNumber(temp);
            }
            sign = "-";
            temp.reSetNumber();
        }
        //乘法功能
        if (keyCode == 106) {
            if (sign.equals("x")) {
                display.addNumber(temp);
            }
            sign = "x";
            temp.reSetNumber();
        }
        //除法功能
        if (keyCode == 111) {
            if (sign.equals("÷")) {
                display.addNumber(temp);
            }
            sign = "÷";
            temp.reSetNumber();
        }

        //刷新显示
        viewText();
    }

    /**
     * 此方法适用于各自情况，如：
     * 输入数字直接按Enter,
     * 输入数字输入符号直接按Enter,
     * 普通输入数字,
     * 输入数字输入符号不按Enter等
     */
    public void viewText() {
        //process面板
        if (display.isEnterLock()) {
            if (sign.equals("null") && borrow) processText.getJTextField().setText(preDisplay.getStringNumber() + "=");
            else if (!sign.equals("null") && !temp.getStringNumber().isEmpty()) processText.getJTextField().setText(preDisplay.getStringNumber() + sign + temp.getStringNumber() + "=");
        } else if (!sign.equals("null") && !borrow) processText.getJTextField().setText(preDisplay.getStringNumber() + sign);
        else processText.getJTextField().setText("");
        //display面板
        if (sign.equals("null")) displayText.getJTextField().setText(display.getStringNumber());
        else if (display.isEnterLock()) displayText.getJTextField().setText(display.getStringNumber());
        else displayText.getJTextField().setText(temp.getStringNumber());
    }
}
